package com.defangit.production.bll;

import com.defangit.production.domain.ProductionProcess;
import laogen.util.entities.Finder;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

/**
 * Created by zhangfagen on 2018/6/6.
 */
public interface ProductionProcessBll extends CommonBusinessLogic<ProductionProcess> {
    /**
     * 添加工序派工单
     * @param billId 工序派工单所属的生产订单id
     * @param process 要添加的工序派工单
     * @return 添加后的工序派工单
     */
    ProductionProcess addProductionProcess(int billId,ProductionProcess process);
    /**
     * 添加工人
     * @param workerIds 工人的ID
     * @return 生产订单
     * */
    ProductionProcess addWorkersProcess(Integer processId,List<Integer> workerIds);
    ProductionProcess updateProductionProcess(ProductionProcess process);
    ProductionProcess updateWorkShop(Integer processId,Integer operatorId);
    boolean deleteProductionProcess(int processId);

    /**
     * 工序负责人开启工序
     * @param liableId 负责人id
     * @param processId 要开启的工序id
     * @param operators 工序涉及的生产工人
     * @return 是否成功开启工序
     */
    boolean beginProcess(int liableId, int processId, Set<Integer> operators);

    /**
     * 工序负责人结束并移交工序完工产品
     * @param liableId 负责人id
     * @param sourceProcessId 要结束的工序id
     * @param targetProcessId 移交的目标工序
     * @return 是否成功结束工序
     */
    boolean endProcess(int liableId,int sourceProcessId,int targetProcessId);

    /**
     * 被移交工序负责人确认接手工序
     * @param liableId 负责人id
     * @param processId 要接手的工序id
     * @return 是否成功接手工序
     */
    boolean acceptProcess(int liableId,int processId);
    /**
     * 更新工序订单的计划开启时间
     * @param processId 工序派工单所属的生产订单id
     * @param expectTime 要添加的工序派工单开启日期
     * @param liableId 工序订单负责人or生产订单负责人
     * @return 添加后的工序派工单
     */
    ProductionProcess updateExpectStartTime(LocalDateTime expectTime,Integer processId,Integer liableId);
    /**
     * 更新工序订单的计划开启时间
     * @param processId 工序派工单所属的生产订单id
     * @param expectTime 要添加的工序派工单完成日期
     * @param liableId 工序订单负责人or生产订单负责人
     * @return 添加后的工序派工单
     */
    ProductionProcess updateExpectEndTime(LocalDateTime expectTime,Integer processId,Integer liableId);
    ProductionProcessFinder findAll();
    interface ProductionProcessFinder extends Finder<ProductionProcess> {
        /**
         * 根据产品工序状态筛选产品工序
         * @param status 工序状态 0：未开启 1：进行中 2：已完成
         * @return 筛选完工状态后的产品工序查询
         */
        ProductionProcessFinder status(Integer status);

        /**
         * 根据负责人筛选产品工序
         * @param liableId 要查询的负责人id
         * @return 筛选负责人后的产品工序查询
         */
        ProductionProcessFinder liable(Integer liableId);

        /**
         * 根据指定工人筛选工序订单
         * @param id of worker
         * @return production processes
         * */
        ProductionProcessFinder workerId(Integer id);
    }
}
